W801 | 您所在的位置:网站首页 › 汇编 ld › W801 |
相关参考:打酱油的工程师:W801|芯片规格书|寄存器手册|总线|时钟|主频|学习(5-1):W801-SDK启动分析之芯片规格书及寄存器手册阅读笔记前言 W801 默认程序是从内部FLASH 中开始运行的。 (具体执行流程及.ELF文件可参考:[FLASH算法|.elf文件|基本类型- FLASH算法文件介绍](FLASH算法|.elf文件|基本类型- FLASH算法文件介绍)) SDK所采用的编译工具链为csky-elfabiv2。链接文件是:gcc_csky.ld。 关键字ENTRY所指向的入口是Reset_Handler,即启动时先进行复位操作,之后进入启动程序,执行startup.S。 startup.S文件分析startup.S 是SDK的启动文件,位于:G:\bsp\W800_aos\W80X_SDK_v1.00.10\platform\arch\xt804\bsp\startup.S smartl的启动文件应与GCC一起用于CSKY嵌入式处理器,SDK启动时,先运行sys目录下的startup.S。 接着运行系统初始化程序: 3个初始化进程主要执行3个初始化进程: 系统初始化#ifndef __NO_SYSTEM_INIT jbsr SystemInit #endif SystemInit执行G:\bsp\W800_aos\W80X_SDK_v1.00.10\platform\arch\xt804\bsp\system.c 引入必要的头文件: #include #include "csi_core.h" #include "wm_regs.h" #include "wm_cpu.h"定义:extern int32_t g_top_irqstack; irq堆栈定义:g_top_irqstack: .section .vdata .align 10 .globl irq_vectors .type irq_vectors, @object irq_vectors: .space CONFIG_IRQ_VECTOR_SIZE .size irq_vectors, . - irq_vectors .globl irq_vectors_end irq_vectors_end:函数csi_coret_get_loadextern uint32_t csi_coret_get_load(void); 函数体: 功能:获取核心计时器重新装载值 返回值:核心计时器值 __STATIC_INLINE uint32_t csi_coret_get_load(void) { return CORET->LOAD; } 函数csi_coret_get_value:extern uint32_t csi_coret_get_value(void); 函数体: 功能:获取核心计时器计数器值 返回值: 核心计时器计数器值 __STATIC_INLINE uint32_t csi_coret_get_value(void) { return CORET->VAL; } 板级初始化:主要完成采用UART0或UART1串口波特率及端口设置。 #ifndef __NO_BOARD_INIT jbsr board_init #endif初始化内容:void board_init(void) { #if USE_UART0_PRINT /* use uart0 as log output io */ uart0Init(115200); set_printf_port(0); #else uart1_io_init(); /* use uart1 as log output io */ uart1Init(115200); set_printf_port(1); #endif }uart0Init()函数定义:static void uart0Init (int bandrate) { unsigned int bd; NVIC_DisableIRQ(UART0_IRQn); NVIC_ClearPendingIRQ(UART0_IRQn); bd = (APB_CLK/(16*bandrate) - 1)|(((APB_CLK%(bandrate*16))*16/(bandrate*16)) |
CopyRight 2018-2019 实验室设备网 版权所有 |